package com.zzccyy.jpdemo.utils;

import android.content.Context;
import android.content.SharedPreferences;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class SPUtils {
    // SP文件名（可自定义）
    private static final String SP_NAME = "app_data";
    // 单例实例
    private static SPUtils instance;
    // SharedPreferences实例
    private final SharedPreferences sp;
    // Gson实例（用于JSON转换）
    private final Gson gson;

    // 私有构造函数（防止外部创建）
    private SPUtils(Context context) {
        // 初始化SharedPreferences（使用应用上下文，避免内存泄漏）
        sp = context.getApplicationContext().getSharedPreferences(SP_NAME, Context.MODE_PRIVATE);
        gson = new Gson();
    }

    // 获取单例实例
    public static synchronized SPUtils getInstance(Context context) {
        if (instance == null) {
            instance = new SPUtils(context);
        }
        return instance;
    }

    // -------------------------- 核心：存储/读取List<Bean> --------------------------

    /**
     * 存储List<Bean>集合
     * @param key 键名
     * @param list 要存储的集合（支持任意Bean类型）
     */
    public <T> void putList(String key, List<T> list) {
        if (list == null || list.isEmpty()) {
            // 若集合为空，直接存储空字符串（避免后续解析错误）
            sp.edit().putString(key, "").apply();
            return;
        }
        // 将List转换为JSON字符串
        String json = gson.toJson(list);
        sp.edit().putString(key, json).apply();
    }

    /**
     * 读取List<Bean>集合
     * @param key 键名
     * @param clazz Bean的类对象（用于泛型解析）
     * @return 解析后的集合（若不存在或解析失败，返回空集合）
     */
    public <T> List<T> getList(String key, Class<T> clazz) {
        String json = sp.getString(key, "");
        if (json.isEmpty()) {
            return new ArrayList<>(); // 空集合，避免返回null
        }
        try {
            // 构造List<T>的类型（解决泛型擦除问题）
            Type type = TypeToken.getParameterized(List.class, clazz).getType();
            // 将JSON字符串转换为List<T>
            return gson.fromJson(json, type);
        } catch (Exception e) {
            e.printStackTrace();
            return new ArrayList<>(); // 解析失败时返回空集合
        }
    }

    // -------------------------- 补充：其他基础类型操作（可选） --------------------------

    /**
     * 存储String类型
     */
    public void putString(String key, String value) {
        sp.edit().putString(key, value).apply();
    }

    /**
     * 读取String类型
     */
    public String getString(String key, String defaultValue) {
        return sp.getString(key, defaultValue);
    }

    /**
     * 存储int类型
     */
    public void putInt(String key, int value) {
        sp.edit().putInt(key, value).apply();
    }

    /**
     * 读取int类型
     */
    public int getInt(String key, int defaultValue) {
        return sp.getInt(key, defaultValue);
    }

    /**
     * 存储boolean类型
     */
    public void putBoolean(String key, boolean value) {
        sp.edit().putBoolean(key, value).apply();
    }

    /**
     * 读取boolean类型
     */
    public boolean getBoolean(String key, boolean defaultValue) {
        return sp.getBoolean(key, defaultValue);
    }

    /**
     * 删除某个键值对
     */
    public void remove(String key) {
        sp.edit().remove(key).apply();
    }

    /**
     * 清空所有数据
     */
    public void clear() {
        sp.edit().clear().apply();
    }

    /**
     * 判断是否包含某个键
     */
    public boolean contains(String key) {
        return sp.contains(key);
    }

    /**
     * 获取所有键值对
     */
    public Map<String, ?> getAll() {
        return sp.getAll();
    }
}